package controlador;

import vista.VistaBlackJack;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import modelo.Jugador;
import modelo.Persona;
import modelo.Banca;

public class ControladorBlackJack {
	private static ControladorBlackJack control;
	private VistaBlackJack vista;
	private List mesa;		
	
	private ControladorBlackJack(){
		vista = new VistaBlackJack();
		this.jugar();
	}
	
	public static ControladorBlackJack getInstancia(){
		if (control==null){
			control = new ControladorBlackJack();
		}
		return control;		
	}
	
	public void jugar(){
		int cantJugadores = vista.getNumeroDeJugadores();
		mesa = new ArrayList();
		Jugador jugador;
		Banca banca;
		
		for (int i=0; i <= cantJugadores; i++){
			if (i==0){
				mesa.add(new Banca());
			}
			else{
				mesa.add(new Persona(vista.setNombreJugador(i)));
			}
		}
		
		Iterator iterator = mesa.listIterator();
		banca = (Banca) iterator.next();
		banca.repartir(banca);
		banca.calcularPuntaje();
		
		while (iterator.hasNext()){
			jugador = (Jugador) iterator.next();
			banca.repartir((Persona) jugador);
			jugador.calcularPuntaje();
		}
		
		iterator = mesa.listIterator();
		banca = (Banca) iterator.next();
		vista.mostrarMano(banca);
		
		while (iterator.hasNext()){
			jugador = (Jugador) iterator.next();
			vista.mostrarMano(jugador);
			while (jugador.getEstado() == 0){
				if (vista.pedirOtraCarta() == 0){
					jugador.pedirCarta(banca);
					jugador.calcularPuntaje();
					vista.mostrarMano(jugador);
					if (jugador.getPuntaje() > 21){
						jugador.setEstado(2);
					}
				}
				else{
					jugador.setEstado(1);
				}
			}
		}
	
		banca.jugar();	
		vista.mostrarMano(banca);	
		
		for (int i=1; i <= cantJugadores; i++){
			jugador = (Jugador) mesa.get(i);
			if (jugador.getEstado() == 2){
				vista.avisaPerdedor(jugador);
			}
			else{
				if (banca.getEstado()==2){
					vista.avisaGanador(jugador);
				}
				else{
					if (banca.getPuntaje() > jugador.getPuntaje()){
						vista.avisaPerdedor(jugador);		
					}
					else{
						vista.avisaGanador(jugador);
					}
				}
			}			
		}
	}
}
